package com.aloda.controller.admin;

import cn.hutool.core.bean.BeanUtil;
import com.aloda.annotation.AdminAuthCheck;
import com.aloda.annotation.OperateLogAnno;
import com.aloda.constant.ExceptionConstant;
import com.aloda.dto.appCategory.AppCategoryAddDTO;
import com.aloda.dto.appCategory.AppCategoryEditDTO;
import com.aloda.entity.AppCategory;
import com.aloda.enums.AppCategoryStatusEnum;
import com.aloda.exception.BaseException;
import com.aloda.query.AppCategoryPageDTO;
import com.aloda.result.PageResult;
import com.aloda.result.Result;
import com.aloda.service.AppCategoryService;
import com.aloda.vo.appCategory.AppCategoryInfoVO;
import com.aloda.vo.appCategory.AppCategoryListVO;
import com.aloda.vo.appCategory.AppCategoryPageVO;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Slf4j
@RestController("category-admin")
@RequestMapping("/admin/category")
public class AppCategoryController {

    @Resource
    private AppCategoryService appCategoryService;

    /**
     * 新增应用分类
     * @param appCategoryAddDTO 新增应用分类的 DTO
     * @return 新增分类的 ID
     */
    @OperateLogAnno(category = "新增应用分类")
    @PostMapping
    public Result<Long> addAppCategory(@RequestBody AppCategoryAddDTO appCategoryAddDTO) {
        if (appCategoryAddDTO == null) {
            throw new BaseException(ExceptionConstant.FORMAT_ERROR);
        }
        return Result.success(appCategoryService.addAppCategory(appCategoryAddDTO));
    }

    /**
     * 分页查询应用分类
     * @param appCategoryPageDTO 分页查询的 DTO
     * @return 分页查询结果
     */
    @PostMapping("/page")
    public Result<PageResult<AppCategoryPageVO>> pageQuery(@RequestBody AppCategoryPageDTO appCategoryPageDTO) {
        PageResult<AppCategoryPageVO> pageResult = appCategoryService.pageQuery(appCategoryPageDTO);
        return Result.success(pageResult);
    }

    /**
     * 通过 ID 获取应用分类信息
     * @param id 分类 ID
     * @return 应用分类信息
     */
    @GetMapping("/{id}")
    public Result<AppCategoryInfoVO> getAppCategoryById(@PathVariable Long id) {
        AppCategoryInfoVO appCategoryInfoVO = BeanUtil.copyProperties(appCategoryService.getById(id), AppCategoryInfoVO.class);
        return Result.success(appCategoryInfoVO);
    }

    /**
     * 编辑应用分类
     * @param appCategoryEditDTO 编辑应用分类的 DTO
     * @return 编辑结果
     */
    @OperateLogAnno(category = "编辑应用分类")
    @PutMapping
    public Result<Long> editAppCategory(@RequestBody AppCategoryEditDTO appCategoryEditDTO) {
        return Result.success(appCategoryService.editAppCategory(appCategoryEditDTO));
    }

    /**
     * 删除应用分类
     * @param ids 要删除的分类 ID 列表
     * @return 删除结果
     */
    @AdminAuthCheck
    @OperateLogAnno(category = "删除应用分类")
    @DeleteMapping
    public Result<Boolean> deleteAppCategory(@RequestBody List<Long> ids) {
        return Result.success(appCategoryService.deleteAppCategory(ids));
    }

    /**
     * 导出应用分类表格
     * @param response HttpServletResponse 对象
     * @param ids 要导出的分类 ID 列表
     */
    @OperateLogAnno(category = "导出应用分类表格")
    @PostMapping("/export")
    public void exportAppCategoryToExcel(HttpServletResponse response, @RequestBody List<Long> ids) {
        appCategoryService.exportAppCategoryToExcel(response, ids);
    }

    /**
     * 获取所有正常的应用分类
     * @return
     */
    @GetMapping("/list")
    public Result<List<AppCategoryListVO>> getNormalCategoryList() {
        return Result.success(appCategoryService.getNormalCategoryList());
    }
}
